import axios, { InternalAxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
import { ElMessageErrorTip } from './elUtil'

const createService = (baseURL = '', timeout = 5000) => {
  const service = axios.create({
    baseURL,
    timeout
  })

  // 请求拦截器
  service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
      const token = localStorage.getItem('token')
      if (token) {
        config.headers.satoken = token
      }

      return config
    },

    (error: AxiosError) => {
      return Promise.reject(error)
    }
  )

  // 响应拦截器
  service.interceptors.response.use(
    (response: AxiosResponse) => {
      return response.data
    },
    (error: AxiosError) => {
      const { code, message } = error
      if (error.response) {
        // 发送请求成功 并收到服务器的响应
        handleServiceError(error.response, message)
        return Promise.reject(error)
      } else if (error.request) {
        // 发送请求成功 未收到服务器的响应
        handleHttpError(code, message)
        return Promise.reject(error)
      } else {
        // 其他错误情况 如发送请求失败等
        ElMessageErrorTip(`前端错误 请联系管理人员：${message}`)
      }
    }
  )

  return service
}

/**
 * 处理服务器响应错误
 * @param response 服务器响应
 * @param message 错误消息
 */
const handleServiceError = (response: AxiosResponse, message: string) => {
  const { status, data, statusText } = response

  switch (status) {
    case 401:
      ElMessageErrorTip('账号已过期 请重新登录')
      window.location.href = '/'
      break
    case 500:
      ElMessageErrorTip(`${data.message || statusText}`)
      break
    default:
      ElMessageErrorTip(`服务器错误 请联系管理人员：${status}:${message}`)
  }
}

/**
 * 处理Http错误
 * @param code code码
 * @param message 消息
 */
const handleHttpError = (code: string | undefined, message: string) => {
  switch (code) {
    case 'ECONNABORTED':
    case 'ETIMEDOUT':
      ElMessageErrorTip('网络连接错误 请联系管理人员')
      break
    default:
      ElMessageErrorTip(`网络错误 请联系管理人员：${code}:${message}`)
      break
  }
}

export default createService
